package main

import (
	"fmt"
	"sort"
)

/*
根据结构体中的某个字段进行排序
类似于java中的自定义Comparator类
需要实现sort包中的 Interface接口的三个方法
*/

type Person struct {
	Name string
	Age  int
}

// Persons 定义一个Persons别名，来标识[]Person，这样Persons才可以继承Interface的接口
type Persons []Person

// Len 获取此 slice 的长度
func (p Persons) Len() int {
	return len(p)
}

// Less 定义排序规则
/*
如果返回true，说明i，j不需要重排
如果返回false，说明i，j需要交换

返回 obj1 < obj2，说明是升序排列
返回 obj1 > obj2, 说明是降序排列
*/
//这里按照年龄降序排列
func (p Persons) Less(i, j int) bool {
	return p[i].Age > p[j].Age
}

//Swap 交换的逻辑
func (p Persons) Swap(i, j int) {
	p[i], p[j] = p[j], p[i]
}

func main() {
	persons := Persons{
		{
			Name: "test1",
			Age:  20,
		},
		{
			Name: "test2",
			Age:  22,
		},
		{
			Name: "test3",
			Age:  21,
		},
	}
	sort.Sort(persons)
	fmt.Println(persons) //[{test2 22} {test3 21} {test1 20}]

}
